package gomz.pres.question;

import gomz.pres.GUIMain;
import gomz.pres.ListCheckedListener;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

/**
 * Diese Klasse steuert das UI GUIQOverview. Es reagiert auf die Eingaben des Benutzers.
 * @author Murillo
 *
 */
public class CQOverview {
	// ********************************************************************************
	// Variablen
	// ********************************************************************************
	private MQuestion model;
	private GUIQOverview view;
	private GUIMain mainWindow;
	
	//*********************************************************************************
	// Konstruktor
	// ********************************************************************************
	
	 /**
	  * Konstruktor fuer den Controller der Fragestellung
	  * @param pWindow Vaterfenster welches verwendet werden soll
	  * @param view GUIQOverview welches kontrolliert werden soll
	  * @param model MQuestion Model, welches benutzt werden soll
	  */
	public CQOverview(GUIMain mainWindow, GUIQOverview view, MQuestion model) {
		this.model = model;
		this.view = view;
		this.mainWindow = mainWindow;
		
		addListener();
		fillData();
	}
	// ********************************************************************************
	// Listener
	// ********************************************************************************
	/**
	 * Diese Methode fuegt die Listener hinzu
	 */
	private void addListener(){
		//Buttons**********************************************************************		
		//Editieren
		view.getBtOedit().addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				doEdit();
			}
		});
		
		//Loeschen
		view.getBtOdel().addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				doDelete();
			}
		});
		
		//Neu
		view.getBtOnew().addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				doNew();
			}
		});
		
		//Suchen
		view.getBtIconSearch().addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				doSearch(view.getTfSearch().getText());
			}
		});
		
		//Suche abbrechen
		view.getBtIconSearchCan().addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				doSearchCancel();
			}
		});
		
		//Listen************************************************************************
		//Fragenauswahl
		view.getLiOque().addListSelectionListener(new ListSelectionListener() {
			public void valueChanged(ListSelectionEvent e) {
				//da das event vorkommt, wenn ein Feld deselektiert wird und wenn es seleltiert wird
				if (e.getValueIsAdjusting() == false){
					doQuestionChange(view.getLiOque().getSelectedIndex());
				}
			}
		});
		
		//Kategorieauswahl
		view.getLiOcategory().addListCheckedListener(new ListCheckedListener() {
			public void checkedPerformed() {
				doCategoryChange();				
			}
		});
	}
	
	// ********************************************************************************
	// Methoden
	// ********************************************************************************
	/**
	 * Diese methode oeffned eine bestehende Fragestellung und ladet die Daten vom server
	 */
	public void doEdit(){
		int idToOpen = view.getLiOque().getSelectedIndex();
		
		if ((idToOpen != -1) && !model.getQuestionCoresUsed().isEmpty()){
			if(!model.openQuestion(model.getQuestionCoresUsed().get(idToOpen).getId())){
				JOptionPane.showMessageDialog(mainWindow, "Die Fragestellung konnte nicht geoeffnet werden.", "Fragestellung oeffnen", JOptionPane.ERROR_MESSAGE);
			}
			else{
				//restliche Tabs enablen und aktuellen auf Fragestellung setzten
				setHexQuestionTabsEnable(true);
				mainWindow.getTabbsQuestion().setSelectedIndex(1);
				mainWindow.getTabbsQuestion().repaint();
			}
		}		
	}
	
	/**
	 * Diese Methode loescht die selektriert Fragestellung
	 */
	public void doDelete(){
		int indexToDel = view.getLiOque().getSelectedIndex();
		
		if (indexToDel != -1  && !model.getQuestionCoresUsed().isEmpty()){
			if(!model.deleteQuestion(indexToDel)){
				JOptionPane.showMessageDialog(mainWindow, "Die Fragestellung konnte nicht geloescht werden.", "Fragestellung loeschen", JOptionPane.ERROR_MESSAGE);
			}
			else{
				view.getLiOque().setListData(model.getQuestionList());
			}
		}
	}
	
	/**
	 * Diese Methode erstellt eine neue Fragestellung
	 */
	public void doNew(){
		model.newQuestion();
		setHexQuestionTabsEnable(false);
		mainWindow.getTabbsQuestion().setEnabledAt(1, true);
		mainWindow.getTabbsQuestion().setSelectedIndex(1);
	}
	
	/**
	 * Diese Methode zeigt die Frage der Fragestellung der selektierten Frage als vorschau an
	 * @param liIndex Index der selektierten Frage aus der Liste
	 */
	private void doQuestionChange(int liIndex){
		if(liIndex!=-1){
			view.getTaOcon().setText(model.getQuestionCoresUsed().get(liIndex).getQuestion());
			//Possition an den Anfgan der Textarea setzten
			view.getTaOcon().setCaretPosition(0);
		}
		else{
			view.getTaOcon().setText("");
		}
	}
	
	/**
	 * Diese Methode filtert die Fragestellungen anhand der selektierten Kategorien
	 */
	private void doCategoryChange(){
		int[]si = view.getLiOcategory().getCheckedIndeces();
		model.filterQuestionToUse(si);
		view.getLiOque().setListData(model.getQuestionList());
	}
	
	/**
	 * Diese Methode setzt die Tabs nach der Fragestellung auf enable bzw. disable
	 * @param enable Boolean ob die Tabs enabled oder disabled werden sollen
	 */
	private void setHexQuestionTabsEnable(boolean enable){
		for (int ti = 1; ti < mainWindow.getTabbsQuestion().getTabCount(); ti++){
			mainWindow.getTabbsQuestion().setEnabledAt(ti, enable);
		}
	}
	
	/**
	 * Diese Methode durchsucht alle fuer den Benutzer sichtbaren Fragestellungen nach dem uebergebenen Title und Zeigt die Treffer an
	 * @param searchString zu suchender Titel einer Fragestellung
	 */
	private void doSearch(String searchString){
		view.getLiOcategory().uncheckAll();
		model.setQuestionCoresUsed(model.search(searchString));
		view.getLiOque().setListData(model.getQuestionList());
	}
	
	/**
	 * Diese Methode setzt den Inhalt des Suchfensters zurueck auf "" und zeigt die Fragestellung gefiltert nach den selektierten
	 * Kategorien an.
	 */
	private void doSearchCancel(){
		view.getTfSearch().setText("");
		doCategoryChange();
	}
	
	/**
	 * Diese Methode setzt die benoetigten Daten ins GUI
	 */
	public void fillData(){
		view.getLiOcategory().setListData(model.getCategoryList());
		view.getTaOcon().setText("");
		int[]si = view.getLiOcategory().getCheckedIndeces();
		model.filterQuestionToUse(si);
		view.getLiOque().setListData(model.getQuestionList());
	}
}
